Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | export const dynamic = "force-dynamic"; /** * Admin Canned Response Detail API * GET /api/admin/support/canned-responses/[id] - Get canned response * PATCH /api/admin/support/canned-responses/[id] - Update canned response * DELETE /api/admin/support/canned-responses/[id] - Delete canned response */ import { NextRequest, NextResponse } from 'next/server'; import { requireAdminRole, handleAuthError } from '@/lib/auth'; import { prisma } from '@/lib/prisma'; import { UpdateCannedResponseSchema } from '@/lib/validation/support-schemas'; import { handleError } from '@/lib/error-handler'; import { logger } from '@/lib/logging'; interface RouteParams { params: Promise<{ id: string }>; } export async function GET(request: NextRequest, { params }: RouteParams) { try { await requireAdminRole(); const { id } = await params; const response = await prisma.cannedResponse.findUnique({ where: { id }, include: { creator: { select: { id: true, name: true }}}}); if (!response) { return NextResponse.json( { success: false, error: 'Canned response not found' }, { status: 404 } ); } return NextResponse.json({ success: true, data: response}); } catch (error) { const authResponse = handleAuthError(error as Error); if (authResponse) return authResponse; logger.error('Error fetching canned response', error instanceof Error ? error : new Error(String(error)), { category: 'ADMIN_SUPPORT' }); return handleError(error); } } export async function PATCH(request: NextRequest, { params }: RouteParams) { try { await requireAdminRole(); const { id } = await params; // Check if response exists const existingResponse = await prisma.cannedResponse.findUnique({ where: { id }}); if (!existingResponse) { return NextResponse.json( { success: false, error: 'Canned response not found' }, { status: 404 } ); } // Validate input const body = await request.json(); const validationResult = UpdateCannedResponseSchema.safeParse(body); if (!validationResult.success) { return NextResponse.json( { success: false, error: 'Validation failed', details: validationResult.error.flatten().fieldErrors}, { status: 400 } ); } const data = validationResult.data; // Check shortcut uniqueness if changing if (data.shortcut && data.shortcut !== existingResponse.shortcut) { const shortcutExists = await prisma.cannedResponse.findUnique({ where: { shortcut: data.shortcut }}); if (shortcutExists) { return NextResponse.json( { success: false, error: 'A canned response with this shortcut already exists' }, { status: 409 } ); } } // Build update data const updateData: Record<string, unknown> = {}; if (data.title !== undefined) updateData.title = data.title; if (data.shortcut !== undefined) updateData.shortcut = data.shortcut; if (data.content !== undefined) updateData.content = data.content; if (data.category !== undefined) updateData.category = data.category; // Update the canned response const response = await prisma.cannedResponse.update({ where: { id }, data: updateData, include: { creator: { select: { id: true, name: true }}}}); logger.info('Canned response updated', { category: 'ADMIN_SUPPORT', responseId: id, changes: Object.keys(updateData)}); return NextResponse.json({ success: true, data: response}); } catch (error) { const authResponse = handleAuthError(error as Error); if (authResponse) return authResponse; logger.error('Error updating canned response', error instanceof Error ? error : new Error(String(error)), { category: 'ADMIN_SUPPORT' }); return handleError(error); } } export async function DELETE(request: NextRequest, { params }: RouteParams) { try { await requireAdminRole(); const { id } = await params; // Check if response exists const response = await prisma.cannedResponse.findUnique({ where: { id }, select: { id: true, title: true }}); if (!response) { return NextResponse.json( { success: false, error: 'Canned response not found' }, { status: 404 } ); } // Delete the canned response await prisma.cannedResponse.delete({ where: { id }}); logger.info('Canned response deleted', { category: 'ADMIN_SUPPORT', responseId: id, title: response.title}); return NextResponse.json({ success: true, message: 'Canned response deleted successfully'}); } catch (error) { const authResponse = handleAuthError(error as Error); if (authResponse) return authResponse; logger.error('Error deleting canned response', error instanceof Error ? error : new Error(String(error)), { category: 'ADMIN_SUPPORT' }); return handleError(error); } } |